//==================================================================
//  Copyright (C) 2006  Davide Pasca
//
//  This library is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Lesser General Public
//  License as published by the Free Software Foundation; either
//  version 2.1 of the License, or (at your option) any later version.
//
//  This library is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//  Lesser General Public License for more details.
//
//  You should have received a copy of the GNU Lesser General Public
//  License along with this library; if not, write to the Free Software
//  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
//==================================================================
///
///
///
///
///
//==================================================================

#ifndef RENDM5D_MESH_H
#define RENDM5D_MESH_H

#include "psys.h"
#include "m5d_mesh.h"
#include "rend_device.h"
#include "rendm5d_params.h"

//==================================================================
namespace RendM5D {

//==================================================================
/// RendM5D::Mesh
//==================================================================
class Mesh
{
	RendDevice				*_rdevicep;
public:
	PMath::Matrix44			_view_obj_m;
	PMath::Matrix44			_secondary_proj_obj_m;
	PMath::Matrix44			_light_rgb_mats[3];

	M5D::Mesh						*_mmeshp;
	autodel<M5D::DispList>	_tri_id_dlistp;
	autodel<M5D::DispList>	_obj_id_dlistp;
	autodel<M5D::DispList>	_onoff_dlistp;

	//--------------------------------------------------------------
	Mesh( M5D::Mesh *mmeshp, RendDevice *rdevicep );
	~Mesh()
	{
	}

	//--------------------------------------------------------------
/*
	void		RenderBBox();
	void		RendPlainOneFace( int tri_idx );
*/
	void		PrepareStandard( RendM5D::Params &rparams );
	void		PrepareSpecial( RendM5D::Params &rparams );
	void		UpdateGeometry() throw(...);

	bool		RenderStandard( RendM5D::Params &rparams, bool render_opaque );
	void		RenderSpecial( RendM5D::Params &rparams );

	static void	BeginRenderState_s( RendDevice *rdevicep, RendM5D::Params &rparams, bool render_opaque );
	static void	EndRenderState_s( RendDevice *rdevicep );

private:
	bool		drawGeometry( const M5D::DispList *dlistp, bool render_opaque );
	bool		drawGeometryNoMaterial( const M5D::DispList *dlistp, bool render_opaque );
	bool		drawVertNormals( const M5D::DispList *dlistp, bool render_opaque );
	void		prepareTriOnOff( const u_char *tri_onoffmap, int idx_base, const float on_col[4], const float off_col[4] ) throw(...);
};

};

#endif
